<?php
/**
 * Utilisation des modules depuis le front-office
 *
 * Ce singleton permet de gérer la manipulation des modules dans le front-office.
 *
 * @author Franck Allimant <franck@cqfdev.fr>
 * @version $Id$
 */
require_once(dirname(realpath(__FILE__)) . '/ActionsBase.class.php');

require_once(dirname(realpath(__FILE__)) . '/../Modules.class.php');
require_once(dirname(realpath(__FILE__)) . '/../Modulesdesc.class.php');
require_once(dirname(realpath(__FILE__)) . '/../Variable.class.php');

require_once(dirname(realpath(__FILE__)) . '/../../fonctions/traduction.php');

class ActionsModules extends ActionsBase {

	private static $instance = false;

	protected $plugins_base_dir;

	protected function __construct() {

		// Définir le répertoire de base des plugins
		$this->plugins_base_dir = realpath(dirname(realpath(__FILE__)) . "/../../client/plugins");
	}

	public static function instance() {
		if (self::$instance === false) self::$instance = new ActionsModules();

		return self::$instance;
	}

	/**
	 * @return string le chemin d'accès au dossier plugins sur le disque
	 */
	public function lire_chemin_base() {
		return $this->plugins_base_dir;
	}

	/**
	 * @return string l'URL de base d'accès au dossier plugins
	 */
	public function lire_url_base() {

		$site = new Variable("urlsite");

		return rtrim($site->valeur, '/') . "/client/plugins";
	}

	/**
	 * @method string Retourne le chemin d'accès au répertoire d'un module
	 * @return Répertoire dans lequel se trouve le module
	 * @throws TheliaException::MODULE_REPERTOIRE_NON_TROUVE si le repertoire module n'existe pas
	 */
	public function lire_chemin_module($nom_module, $controle_existence = true) {

		$path = "$this->plugins_base_dir/$nom_module";

		if ($controle_existence === false || (file_exists($path) && is_dir($path)) ) return $path;

		throw new TheliaException(trad("Répertoire du module %s non trouvé", $nom_module), TheliaException::MODULE_REPERTOIRE_NON_TROUVE);
	}

	/**
	 * @method mixed Crée une instance d'un module à partir de son nom
	 * @return l'instance créée
	 * @throws TheliaException::MODULE_CLASSE_NON_TROUVEE si le module n'a pas été trouvé.
	 */
	public function instancier($nom_module) {

		$clazz = ucfirst($nom_module);

		$classpath = $this->lire_chemin_module($nom_module) . "/$clazz". ".class.php";

		// Ne pas utiliser @include, qui masque les éventuelles erreurs dans le fichier classe,
		if (file_exists($classpath) && include_once($classpath))
		{
			$instance = new $clazz();

			// S'assurer que le module a fourni son nom
			if (empty($instance->nom_plugin)) $instance->nom_plugin = $nom_module;

			return $instance;
		}

		throw new TheliaException(trad("Aucune classe trouvé pour %s", $nom_module), TheliaException::MODULE_CLASSE_NON_TROUVEE);
	}

	/**
	 * @method Modules[] Lister les modules d'un type donné
	 * @param int $type: le type de module (Classique, Paiement, Transport, Filtre)
	 */
	public function lister($type = false, $actifs_seulement = false) {

		$liste = array();

		$modules = new Modules();

		$where = '';

		if ($type !== false) $where .= "and type=$type ";
		if ($actifs_seulement !== false) $where .= "and actif=1 ";

		$resul = CacheBase::getCache()->mysql_query("select * from $modules->table where 1 $where order by classement", $modules->link, 'Modules');

		if($resul != "") {
			foreach($resul as $modules) {
				try {

					if (! $actifs_seulement)
					{
						if ($this->est_activable($modules)) {
							$modules->activable = 1;
						} else {
							$modules->activable = 0;
						}
					}

					$liste[] = $modules;

				} catch (TheliaException $e) {
					// Ignorer ce module
				}
			}
		}

		return $liste;
	}

	/**
	 * @method void Appel d'une méthode des modules qui l'implémentent
	 * @param string $methode le nom de la méthode
	 * @param mixed $args l'argument àa passer à la méthode
	 * @param $nom
	 */
	public function appel_module($methode, &$args = '') {

		$liste = $this->lister(false, true);

		foreach($liste as $module) {
			try {
				$instance = $this->instancier($module->nom);

				if (method_exists($instance, $methode)) $instance->$methode($args);
			} catch (Exception $e) {}
		}
	}

	/**
	 *
	 * @method void Mise à jour de la description d'un module
	 * @param string $nom nom du module associé
	 * @param int $lang ID de la langue de la description
	 * @param string $titre titre du module
	 * @param string $chapo chapo du module
	 * @param string $description description du module
	 * @param int $devise ID de la devise associée
	 */
	public function mise_a_jour_description($nom_module, $lang, $titre, $chapo, $description, $devise) {

        $md = new Modulesdesc();

        $existe = $md->verif($nom_module, $lang);

        $md->titre = $titre;
        $md->chapo = $chapo;
        $md->description = $description;
        $md->devise = $devise;

        if ($existe) {
            $md->maj();
        } else {
            $md->id = '';
            $md->lang = $lang;
            $md->plugin = $nom_module;

            $md->add();
        }
	}
}
?>